//配置路由的地方
import Vue from 'vue'
import VueRouter from 'vue-router'
import routes from './routes'
import store from '@/store'

//使用插件
Vue.use(VueRouter)
console.log('router中的index中的Vuerouter', VueRouter.prototype);
//先把VueRouter原型对象的push，先保存一份
let originPush = VueRouter.prototype.push
let originReplace = VueRouter.prototype.replace
//重写push|replace
//第一个参数 location：  告诉原来的push|replace方法，你往哪里跳转（传递哪些参数）
//第二个参数：成功的回调
//第三个参数：失败的回调
VueRouter.prototype.push = function (location, resolve, reject) { //记住不能使用箭头函数！！！
  console.log('自己写的this', this, location);
  if (resolve && reject) {
    //call||appky 区别：
    //相同点，都可以调用函数一次，都可以篡改函数的上下文一次
    //不同点；call与apply传递参数：call传递参数用逗号隔开，apply方法执行，传递数组
    originPush.call(this, location, resolve, reject)
  } else {
    originPush.call(this, location, () => { }, () => { })
  }
}
VueRouter.prototype.replace = function (location, resolve, reject) {
  if (resolve && reject) {
    originReplace.call(this, location, resolve, reject)
  } else {
    originReplace.call(this, location, () => { }, () => { })
  }
}


//配置路由
let router = new VueRouter({
  //配置路由
  routes,
  //滚动行为
  scrollBehavior(to, from, savedPosition) {
    // return 期望滚动到哪个的位置
    //返回的这个y=0，代表的滚动条在最上方
    return { y: 0 }
  }
})

//全局守卫：前置守卫（在路由跳转之间进行判断）
router.beforeEach(async (to, from, next) => {
  //to:可以获取到要跳转到那个的信息
  //from:可以获取到你从哪个路由来的信息
  //next:放行函数 next()放行   next(path)放行到指定路由  next(false)
  //用户登录了，才会有token，未登录一定不会有token
  let token = store.state.user.token
  console.log('全局路由守卫，获取state.user.token', token);
  //用户信息
  let name = store.state.user.userInfo.name
  console.log('name===>', name);
  if (token) {
    //用户已经登陆了还想去login，🙅🏻‍♀️
    let togoPath = to.path
    console.log('我想去~togoPath', togoPath);
    if (to.path == '/login' || to.path == '/register') {
      next('/')
    } else {
      //已经登陆了，访问的是非登录与注册
      //登陆了且拥有用户信息放行
      if (name) {
        next()
      } else {
        //登陆了且没有用户信息
        //在路由跳转之前获取用户信息
        try {
          //获取用户信息成功
          let res = await store.dispatch('getUserInfo')
          console.log('res', res);
          //放行
          next()
        } catch (error) {
          //token失效重新登录
          await store.dispatch('userLogout')
          next('/login')
        }
      }
    }
  } else {
    /* 
      未登录：不能去交易相关、支付相关[pay|paysuccess]、不能去个人中心
      未登录区上面这些路由---登录
    */
    let toPath = to.path
    if (toPath.indexOf('/trade') != -1 || toPath.indexOf('/pay') != -1 || toPath.indexOf('/center') != -1) {
      //把未登录的时候想去而没有去成的信息，存储与地址栏中【路由】
      next('/login?redirect=' + toPath)
    } else {
      console.log('路由守卫--->', to.path);
      next()
    }
  }
})


export default router